package com.tiancheng.onecode.configuration;

import com.tiancheng.onecode.enums.MiniAppTypeEnum;
import com.tiancheng.onecode.exception.Asserts;
import lombok.Data;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import java.util.List;
import java.util.Optional;

/**
 * 小程序配置属性
 *
 * @author kellen
 * @date 2024/12/27
 */
@Data
@Configuration
@EnableConfigurationProperties(MiniAppProperties.class)
@ConfigurationProperties(prefix = "miniapp")
public class MiniAppProperties {

    /**
     * 二维码基础host
     */
    private String qrHost;
    /**
     * 商户后台地址
     */
    private String merchantAdminUrl;
    /**
     * 消息通知地址
     */
    private String notifyUrl;
    /**
     * 订单有效期，分钟。默认5分钟
     */
    private Long orderExpire;
    List<PlatformMiniApp> platforms;

    @Data
    public static class PlatformMiniApp {
        /**
         * 平台编码
         */
        private String platformCode;
        /**
         * 小程序合计
         */
        List<MiniAppInfo> apps;
    }

    @Data
    public static class MiniAppInfo {
        /**
         * 小程序类型
         *
         * @see com.tiancheng.onecode.enums.MiniAppTypeEnum
         */
        private String type;
        /**
         * 设置微信小程序的appid
         */
        private String appid;

        /**
         * 设置微信小程序的Secret
         */
        private String secret;

        /**
         * 设置微信小程序消息服务器配置的token
         */
        private String token;

        /**
         * 设置微信小程序消息服务器配置的EncodingAESKey
         */
        private String aesKey;

        /**
         * 消息格式，XML或者JSON
         */
        private String msgDataFormat;
    }

    /**
     * 获取小程序配置
     *
     * @param platformCode 平台编码
     * @param appTypeEnum  小程序类型
     * @return
     */
    public MiniAppInfo getMiniAppInfo(String platformCode, MiniAppTypeEnum appTypeEnum) {
        Asserts.isTrue(CollectionUtils.isNotEmpty(platforms), "未读取到平台小程序配置！请检查配置文件");
        final Optional<PlatformMiniApp> platform = platforms.stream().filter(p -> p.getPlatformCode().equals(platformCode)).findFirst();
        Asserts.isTrue(platform.isPresent() && CollectionUtils.isNotEmpty(platform.get().getApps()), "未查询到平台小程序配置！，平台编码：" + platformCode);
        final Optional<MiniAppInfo> any = platform.get().getApps().stream().filter(app -> app.getType().equals(appTypeEnum.getCode())).findAny();
        Asserts.isTrue(any.isPresent(), "未查询到小程序配置，小程序类型：" + appTypeEnum.getCode());
        return any.get();
    }
}
